import 'dart:math' as console;

/**
 * 空安全
 * Dart 的空安全是非常可靠的。如果类型系统推断出某个变量不为空，那么它 永远 不为空。
 */
void main(){
  // demo1();
  // demo2();
  // feelNull(null);
  // demo5();
  demo6();
}


void  demo1(){
  String? name; // 加个?号代表可以为 null
  String name1; // 没有?号，代表不能为null
  print(name);
  // print(name1);  编译失败，因为不能为null的不能打印
}

void demo2(){
  String name1;
  name1 = "666";
  print(name1); // 只要不能空，就能编译，编译器会帮忙做检查
}

String demo3(int a){
  String name1;
  name1 = "666";
  if(a == 1){
    return name1;
  }else{
    // return null;   // 只要标识了空安全的，不能返回null
    return "1";
  }
}

// 如果对象是null，那么对象调用方法也直接返回null，不会报错,,这点超级好用也安全
void feelNull(GetData? data){
  data?.name;
  var result = data?.getNum(1);
  print(result);
}

// 有时候需要手动判断是否为空，dart直接提供了断言
//  断言  用于给表达式断言，断言其不能为空，若为空则会在运行时报错。
void demo5(){
  String? s;
  print(s!); // 直接抛出异常：Null check operator used on a null value
}

// 当变量为null时，提供默认值
void demo6(){
  String? name = "Dart";
  print(name!.length); // 4
  print(name ?? 'Default Name');  // Dart

  String? name1;
  // print(name1!.length);  // 直接抛出异常  Null check operator used on a null value
  print(name1 ?? 'Default Name'); // Default Name
}


class GetData {
  String? name;
  int getNum(int i){
    return i+1;
  }
}